import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex);//vue的插件机制

//Vuex.Store 构造器选项
const store = new Vuex.Store({
  state: {//存放状态
    cartList: uni.getStorageSync('cartList') || [],
    storageAddress: uni.getStorageSync("storageAddress"),
    // 用户凭据
    token: ""
  },
  getters:{
    // 获取真正的收货地址 data
    address(state){
      /* 
      1 判断有没有收货地址 缓存 
      2 没有缓存 返回null 
      3 如果有缓存
        1 而且 时间  没有过期 返回 真正收货地址
        2 时间过期了 返回null 

      4 返回真实地址的情况
        1 缓存存在 而且不过期 就返回 真实数据
        2 其他 不管它
       */

      // if (state.storageAddress) {
      //   // 有缓存 -> 判断过期时间  5分钟

      //   if (Date.now() - state.storageAddress.time > 1000 * 60 * 5) {
      //     // 过期
      //     return null 
      //   } else {
      //     // 没有过期 返回真正地址
      //     return state.storageAddress.data;
      //   }

      // } else {
      //   // 没有缓存 返回 null
      //   return null;
      // }
      if(state.storageAddress && (Date.now() - state.storageAddress.time <= 1000 * 60 * 5)){
         // 有缓存 而且没有过期
        return state.storageAddress.data
      }
    },
    // 用户选中的商品数组
    checkedCartList(state){
      return state.cartList.filter(goods => goods.checked)
    },
    // 总价格
    totalPrice(state,getters){
      // 要的选中的商品的总价格！！  checkedCartList 就是过滤后选中的数组
      return getters.checkedCartList.reduce((sum,goods)=> sum += goods.goods_price * goods.num,0)
    },
    // 购买总数量 
    totalCount(state,getters){
      // 要的选中的商品的总价格！！  checkedCartList 就是过滤后选中的数组
      return getters.checkedCartList.reduce((sum,goods)=> sum += goods.num,0)
    },
    // 判断是否要全选
    isAllChecked(state, getters){
      return (
        // 空数组 使用every方法 返回值 true！！！
        state.cartList.length && state.cartList.every((goods) => goods.checked)
      )
    }
  },
  mutations: {
    // 添加数据到购物车
    setCartList(state, cartList) {
      state.cartList = cartList
      console.log(state.cartList);
      uni.setStorageSync("cartList", state.cartList);
    },
    setAddress(state,address){
      state.storageAddress = {data: address,time: Date.now()}
      // 存一份到缓存中
      uni.setStorageSync("storageAddress", state.storageAddress)
    },
    setToken(state,token){
      state.token = token
    }
  },
  actions:{
   // 获取token 异步
   async fetchToken(store) {
    const [err1, { encryptedData, rawData, iv, signature }] =
      await uni.getUserProfile({
        desc: "用于给用户提供刚好体验",
      });

    const [err2, { code }] = await uni.login();

    // 拼接参数 获取token
    const tokenParams = {
      encryptedData,
      rawData,
      iv,
      signature,
      code,
    };

    // 发post请求 获取token  点两次按钮原因是因为 后端程序有bug 还没有修复！！！
    // 改为 uni
    const res3 = await uni.$u.post("/users/wxlogin", tokenParams);

    // 获取token
    const { token } = res3.message;

    store.commit("setToken", token);

    // return token;

  }
  }
})
export default store